import observer.Investor;
import observer.impl.InstitutionalInvestor;
import observer.impl.PersonalInvestor;
import subject.impl.Stock;

/**
 * 观察者模式
 * 观察者模式（Observer）又称发布-订阅模式（Publish-Subscribe：Pub/Sub）。
 * 它是一种通知机制，让发送通知的一方（被观察方）和接收通知的一方（观察者）能彼此分离，互不影响。
 * 每个主题对象中包含了一个所有订阅者的集合。然后一次通知他们。
 * <p>
 * 假设您有一个股票订阅系统。当一支股票的价格发生变动时，您需要通知所有已订阅的用户同步服务。
 * 这里订阅的用户分为个人投资者{@link PersonalInvestor} 和 投资机构{@link InstitutionalInvestor} 两个类
 * 当股票价格变动时将会通知所有订阅这个股票的对象。
 *
 * @author Liu Yicong
 * @date 2025/9/23
 */
public class ObserverClient {
	public static void main(String[] args) {
		// 创建主题
		Stock appleStock = new Stock("Apple", 150.0);

		// 创建观察者
		Investor individual = new PersonalInvestor("张三");
		Investor institution = new InstitutionalInvestor("华尔街资本");

		// 注册观察者
		appleStock.register(individual);
		appleStock.register(institution);

		// 股票价格变动，触发通知
		appleStock.setPrice(155.5);

		System.out.println("\n== 移除一个投资者后 ==");
		appleStock.remove(individual);

		// 股票价格再次变动，只有剩下的投资者收到通知
		appleStock.setPrice(158.0);
	}
}
